<?php

namespace app\controller;

use app\BaseController;
use think\Request;
use think\facade\Db;
use Firebase\JWT\JWT;
use app\model\AdminUsers;
use think\response\Json;

class Login extends BaseController
{
     // login
     public function login(Request $request): Json
     {
         $username = trim($request->post('username', ''));
         $password = trim($request->post('password', ''));
         $remember = $request->post('remember', false, 'boolval');
 
         // 验证用户是否存在
         $user = AdminUsers::where('username', $username)->findOrEmpty();
         if ($user->isEmpty()) {
             return json(['code' => 401, 'msg' => '用户不存在']);
         }
 
         // 校验用户状态
         if ($user->status == 2) {
             return json(['code' => 401, 'msg' => '状态异常，不能登录，请解除冻结后再试']);
         }
 
         // 密码验证
         if (!password_verify($password, $user->password)) {
             return json(['code' => 401, 'msg' => '密码错误']);
         }
 
         // 获取用户角色
         $roleIds = Db::name('admin_role_users')
             ->where('user_id', $user->id)
             ->column('role_id');
 
         if (empty($roleIds)) {
             // 调试信息：用户没有关联角色
             return json(['code' => 401, 'msg' => '用户没有关联角色']);
         }
 
         $roles = Db::name('admin_roles')
             ->whereIn('id', $roleIds)
             ->column('name');
 
         // 获取权限标识
         $permissions = Db::name('admin_role_permissions')
             ->alias('rp')
             ->join('admin_permissions p', 'p.id = rp.permission_id')
             ->whereIn('rp.role_id', $roleIds)
             ->column('p.slug');
 
         // 获取菜单ID集合
         $menuIds = [];
 
         // 角色直接关联的菜单
         $roleMenus = Db::name('admin_role_menu')
             ->whereIn('role_id', $roleIds)
             ->column('menu_id');
 
         // 获取权限关联菜单（修正连接方向）
         $permissionMenus = Db::name('admin_permission_menu')
             ->alias('pm')
             ->join('admin_role_permissions rp', 'pm.permission_id = rp.permission_id')
             ->whereIn('rp.role_id', $roleIds)
             ->column('pm.menu_id');
 
         // 合并菜单ID时处理空数组情况
         $menuIds = array_unique(
             array_merge(
                 $roleMenus ?: [],
                 $permissionMenus ?: []
             )
         );
 
         // 获取菜单详细信息
         $menuDetails = [];
         if (!empty($menuIds)) {
             $menuDetails = Db::name('admin_menu')
                 ->whereIn('id', $menuIds)
                 ->field('id, parent_id, `order`, title, icon, uri')
                 ->select()
                 ->toArray();
         }
 
         // 生成Token
         $expireTime = $remember ? 30 * 24 * 3600 : 3600;
         $payload = [
             'iat' => time(),
             'exp' => time() + $expireTime,
             'uid' => $user['id'],
             'remember' => $remember
         ];
 
         $token = JWT::encode($payload, config('jwt.key'), 'HS256');
 
         // 更新记住我Token
         if ($remember) {
             Db::name('admin_users')
                 ->where('id', $user['id'])
                 ->update(['remember_token' => $token]);
         }
 
         // 更新登录时间和修改时间（同时更新 login_at 和 updated_at）
         Db::name('admin_users')
         ->where('id', $user->id)
         ->update([
             'login_at' => date("Y-m-d H:i:s"),
             'updated_at' => date("Y-m-d H:i:s") // 新增修改时间更新
         ]);
 
         return json([
             'code' => 0,
             'msg' => '登录成功',
             'data' => [
                 'token' => $token,
                 'expires_in' => $expireTime,
                 'roles' => $roles,          // 用户所属角色组
                 'permissions' => array_values(array_unique($permissions)), // 用户权限标识
                 'menu_ids' => array_values($menuIds), // 可操作的菜单ID集合
                 'menu_details' => $menuDetails // 可操作的菜单详细信息
             ]
         ]);
     }


}    